package file;

import java.io.*;

//文件的读写操作 —— IO 流(Stream)
public class Demo2 {
    public static void main(String[] args) {
        //对于 字符的操作
        //往文件中写数据

        try (Writer writer = new FileWriter("./output.txt",true)) {
            //writer.write("Hello Word");

            BufferedWriter bufferedWriter = new BufferedWriter(writer);
            bufferedWriter.write("Hello Word");

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main3(String[] args) {
        //对于 字符的操作
        //从文件中读取数据

        try (Reader reader = new FileReader("./test.txt")) {

            while(true) {
                char[] buf = new char[1024];
                int n = reader.read(buf);
                if(n == -1) {
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.println(buf[i]);
                }
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main2(String[] args) {
        //对于 字节的操作
        //往文件写数据操作

        try (OutputStream outputStream = new FileOutputStream("./output.txt",true)) {
            //对于上面的打开文件的操作呢，当我们打开的时候呢，就会判断是否存在这个文件，如果没有就会自动创建一个对应的文件

            //写入要给字节的数据
            //一次输入一个
            outputStream.write(97);
            outputStream.write(98);
            outputStream.write(99);

            //一次输入多个
            byte[] data = {99,98,97};
            outputStream.write(data);

            //这样去往文件里写入数据的话，上面的 OutputStream outputStream = new FileOutputStream("./output.txt")
            //就会自动的把文件里面的数据删除之后，才会再次往文件里面写入写的数据，如果不想删除上一次的数据，我们就要传一个 true 这个参数
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main1(String[] args) throws IOException {
        //对于 字节的操作
        //从文件读数据操作

        //InInputStream是抽象类不能创建实例，需由子类创建
//        InputStream inputStream = null;
//        try {
//            inputStream = new FileInputStream("./test.txt");
//            //这个运行之后 就相当于是打开是文件，我们对于文件的打开呢，需要存在对于文件的关闭操作 close，否则会出现 文件内存泄漏
//        }finally {
//            inputStream.close();//这个操作是必须要完成的，所以我们需要使用 finally 操作来修饰
//        }
        //但是这样不美观，我们使用 try while resources语法

        try (InputStream inputStream = new FileInputStream("./test.txt")) {
            //这个时候，当完成这个 try中的代码块之后呢，出括号后，就是会自动调用 close，因为这个 InputStream实现了Closeable接口
            while(true) {
                //读操作使用 read()，正常返回的是0——255的int，当读完之后是-1
                //一次读一个字符
//                int data = inputStream.read();
//                System.out.println("data = " + data);
//                if (data == -1) {
//                    //读完了
//                    break;
//                }
//                System.out.println(data);

                //一次读多个字符
                //对于这个数组的长度自行定义，长度任意
                byte[] data = new byte[1024];
                //读操作，会尽可能的把这个 字节数组填满
                //填不满的话，也没有关系，能填几个是几个
                int n = inputStream.read(data);
                //这里的 n 表示读到了几个字节
                System.out.println("n = " + n);
                if (n == -1) {
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.println(data[i]);
                }
                System.out.println("===========================");
            }
        }
    }
}
